AB测试笔记总结Part2

总结这篇文章,主要在学习 AB 测试的过程中遇到了两个方面的问题。其中之一是,课程讲解是将 AB 测试的流程交叉到分析过程、概念讲解等过程中,以致于对 AB 测试的流程没有形成一个完整的体系;另一个问题是,AB 测试中用到的统计学相关知识。在课程中统计学的讲解和公式,表面上是很违背“直觉的”,所以需要一个合适的切入角度去理解 AB 测试中用到的统计学知识。第二部分是对 AB 测试第一部分中补充信息。

1. Boostrap 信息

1.1 Boostrap 注意事项

与真实世界相比,通过自助法获得的置信区间更加乐观。这是因为我们没有关于真实世界的参数化模型,对于真实世界还有一些不了解的情况。思考下尝试了解最大值分布的极端情形:置信区间永远无法包含大于最大观察值的值,并且下限小于最大观察值是不合理的。但是,很有可能有一些未观察到的值大于我们观察到的值,尤其是像示例中所演示的偏斜数据。

但是这并不能否定自助法的优势。自助流程很简单直白。由于不对数据分布做出假设,所以适用于任何情形。结果应该与标准检验的不相上下。但是需要投入计算精力,并且输出取决于输入数据。例如,对于上述示例中第 90 百分位上的 95% 置信区间,推断的区间只能捕获原始生成分布中约 83% 的第 90 百分位数值。但是使用更复杂的二项假设对观察到的数据编制索引,只能使结果提高一个百分点,达到 84%。这两种方法都取决于生成的具体数据:不同的 5000 个数据点将生成不同的区间,准确率也不同。

百分位置信区间的二项式方法参考文档:12

1.2 Bootstrap 置换检验应用

置换检验是一种重新抽样检验,用于比较两组或多组之间的结果变量的值。在置换检验中,我们对组标签进行重新抽样。原理是,在零假设下,所有组的结果分布应该一样,无论是对照组还是实验组。所以,我们可以将所有数据值当做一个大的小组,并模拟零假设。将标签随机地分配给数据点(同时保持原始小组成员比例)可以得出零假设的一个模拟结果。

剩下的步骤与标准假设检验中使用的抽样方法类似,但是我们尚未指定要从中抽样的参考分布,我们直接从收集的数据中抽样。将标签随机分配给所有数据并多次记录结果统计量后,我们将实际观察到的统计量与模拟统计量进行比较。我们看看有多少模拟统计值和实际观察到的统计值一样极端或更极端,并算出 p 值,然后得出结论。

请在下面的单元格中实现置换检验,检验与对照组相比,实验组的次数第 90 百分位是否统计显著性地更小:

  • 初始化一个空列表,用于将样本分位数的差异存储为 sample_diffs
  • 为每个试验创建一个循环:
    • 首先通过随机重排数据点标签(即原始数据中的应变量),生成一个置换样本。(可以使用random.permutation。)
    • 然后,根据置换的标签计算分配给每组的数据点的第 q 分位数。将分位数差异附加到 sample_diffs 列表中。
  • 收集置换样本的分位数差异后,计算实际数据观察到的差异。然后,看看有多少置换样本差异小于或大于观察到的差异,并计算 p 值,具体取决于期望的备择假设。

核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def quantile_permtest(x, y, q, alternative = 'less', n_trials = 10000):
"""
Compute a confidence interval for a quantile of a dataset using a bootstrap
method.

Input parameters:
x: 1-D array-like of data for independent / grouping feature as 0s and 1s
y: 1-D array-like of data for dependent / output feature
q: quantile to be estimated, must be between 0 and 1
alternative: type of test to perform, {'less', 'greater'}
n_trials: number of permutation trials to perform

Output value:
p: estimated p-value of test
"""


# initialize storage of bootstrapped sample quantiles
sample_diffs = []

# For each trial...
for _ in range(n_trials):
# randomly permute the grouping labels
labels = np.random.permutation(y)

# compute the difference in quantiles
cond_q = np.percentile(x[labels == 0], 100 * q)
exp_q = np.percentile(x[labels == 1], 100 * q)
# and add the value to the list of sampled differences
sample_diffs.append(exp_q - cond_q)

# compute observed statistic
cond_q = np.percentile(x[y == 0], 100 * q)
exp_q = np.percentile(x[y == 1], 100 * q)
obs_diff = exp_q - cond_q

# compute a p-value
if alternative == 'less':
hits =
elif alternative == 'greater':
hits =

return (hits / n_trials)

2. 多指标分析

针对多指标或者多轮的多重比较时,需要注意显著性水平是否被放大。如果存在显著性水平放大,那么就需要注意使用相关的校正方法进行校正,例如 Bonferroni 校正 。同时,还需要注意考虑校正是否具有保守的问题,例如当多个指标之间并没有相关性(例如 CTR 和唯一用户数量之间即具有相关性),那么使用 Bonferroni 校正就存在过于保守的问题。

在对多指标分析方面,还有其他非保守性方法,如封闭测试程序、 Boole-Bonferroni 联合校正 以及 Holm-Bonferroni 方案 。同样在使用不同这些方法时,需要确认假设方案的正确性

2.1 Bonferroni Correction 与 Šidák Correction

如果你要跟踪多个评估指标,那么需要知道单个指标的 $\mathrm{I}$ 型错误率使总体出现 $\mathrm{I}$ 型错误的概率是多少。最简单的情形是:假设有 n 个独立的评估指标,如果其中一个指标具有统计显著性结果,则足以表示操控措施成功了。在这种情况下,只是出现一个 I 型错误的概率等于 $\alpha_{over} = 1 - (1-\alpha_{ind})^n$,下图展示了单个指标的错误率 $\alpha_{ind} = .05$ 和 $\alpha_{ind} = .01$:

img]

为了防止这种情况,我们需要对单个检验错误率引入一个校正系数,使总体错误率几乎达到理想水平。一种保守方法是用总体错误率除以被测指标的数量:

$\alpha_{ind} = \alpha_{over}/n$

称之为帮费罗尼校正。如果假设指标相互独立,可以通过 Šidák 校正获得更好的结果:

$\alpha_{ind} = 1-(1-\alpha_{over})^{1/n}$

img

Šidák 校正所画的线比帮费罗尼校正的稍微高一些

在现实中,评估情形很少这么直观。指标之间很有可能关系,而不是相互独立。如果正相关,那么知道一个指标的结果,相关指标很有可能也会指向相同的方向。在这种情形下,上述校正方法就过于保守了,导致总体错误率比理想水平更低(如果是负相关,那么错误率可能上升或下降,取决于执行的检验类型)。

此外,可能需要多个指标都展现出统计显著性,才能表示实验成功了,否则就会存在不同程度的成功,取决于哪些指标似乎受到操控措施的影响。一个指标可能不足以说明值得部署实验中测试的更改。降低单个错误率将使真正的显著效果呈现出统计显著性。也就是说,降低 $\mathrm{I}$ 型错误率还会提高 $\mathrm{II}$ 型错误率,这是另一种保守变化。

最终,在选择错误控制措施时,需要作出小小的权衡。如果完全保守地采用上述某个简单校正方法,那么可能会导致没有实施实际上对指标有影响的更改。需要考虑指标之间的依赖程度,并且什么样的结果表明检验成功了,从而使错误率达到正确的平衡效果。如果你需要所有指标都出现显著变化才能继续,那么可能根本就不需要校正系数。还可以使用虚拟测试结果、自举法和置换法来设定显著性阈值。最后请注意,实际显著性可能最为重要,会覆盖其他统计显著性结果。

虽然此页面的侧重点是介绍评估指标,但是这些注意事项也适用于不变指标。检验的不变指标越多,就越有可能某些检验会显示出统计显著性差异, 即使检验的小组是从对等的总体中抽样出来的。但是,不建议对单个检验应用校正系数,因为我们要避免之后在解释数据时出现更大的问题。正如之前提到的,如果有一个不变指标显示统计显著性差异,也不用紧张,但是可能会产生后续问题,也许会对分析造成影响。

3. 提前结束

提前窥视并作出不在计划之内的提前决策,会带来严重的风险。如果你没有考虑窥视对错误率的影响,那么尽量不要提前查看结果,仅在实验结束时分析结果。这也是为何在收集任何数据之前提前设计实验很重要的另一个原因。

但有些方法可以让我们在设计实验时提前做出决策,例如通过调节单个检验级错误率,使总体错误率不变。对于连续跟踪,此页面描述了关于错误率指标的一般法则:跟踪每个小组的成功次数,一旦计数之和或差异超过某个阈值,则结束实验。更一般的情况是,序贯概率比检验等检验可以提前结束实验,前提是从统计学角度而言,某个指标不会越过统计显著性界限

作者

ZenRay

发布于

2021-04-09

更新于

2021-04-20

许可协议

CC BY-NC-SA 4.0